package com.jt.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.jt.pojo.User;
import com.jt.service.DubboUserService;
import com.jt.util.CookieUtil;
import com.jt.vo.SysResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import redis.clients.jedis.JedisCluster;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Controller
@RequestMapping("/user")
public class UserController {
    public static final String TICKET = "JT_TICKET";

    @Autowired
    private JedisCluster jedisCluster;
    //消费者在启动时检查是否有服务提供者  false 不检查,程序调用的时候才校验
    @Reference(check = false)
    private DubboUserService userService;


    /**
     * 完成用户退出操作
     * 1.url: http://www.jt.com/user/logout.html
     * 2.没有传递参数
     * 3.返回值: string  重定向到系统首页
     * 业务实现思路:
     * 	 0.先获取cookie中的数据 NAME=JT_TICKET
     * 	 1.删除redis中的数据     key-value    key=cookie中的value
     * 	 2.删除cookie记录	   根据cookie名称  设置存活时间即可.
     *
     * 注意事项: request对象中只能传递cookie的name和value.不能传递其他数据参数.
     *          所以如果需要再次操作cookie则最好设定参数,否则可能导致操作失败
     */
    @RequestMapping("/logout")
    public String logout(HttpServletRequest request,HttpServletResponse response){
        Cookie cookie = CookieUtil.getCookieByName(request, TICKET);
        if (cookie != null){
            String jtTicket = cookie.getValue();
            if(!StringUtils.isEmpty(jtTicket)){
                jedisCluster.del(jtTicket);
                CookieUtil.deleteCookie(TICKET,"/","jt.com",response);
            }
        }

//        //1.如何获取cookie中的数据?
//        Cookie[] cookies = request.getCookies();
//        //2.校验Cookie数据是否为null
//        if(cookies !=null && cookies.length>0){
//            for(Cookie   cookie : cookies){
//                if(TICKET.equalsIgnoreCase(cookie.getName())){
//                    jtTicket = cookie.getValue();
//                    //业务需要提前删除Cookie
//                    cookie.setMaxAge(0);
//                    cookie.setPath("/");
//                    cookie.setDomain("jt.com");
//                    response.addCookie(cookie);
//                    break;
//                }
//            }
//        }
//        //2.校验数据是否有效
//        if(!StringUtils.isEmpty(jtTicket)){
//            //如果数据不为null,则开始执行退出操作.
//            jedisCluster.del(jtTicket); //根据key,删除Redis中的记录
//            //删除cookie.
//        }

        return "redirect:/";
    }


    /**·
     * 业务说明:完成用户数据入库操作
     * 1.url地址: http://www.jt.com/user/doRegister
     * 2.参数问题: {password:_password,username:_username,phone:_phone},
     * 3.返回值结果: SysResult对象
     */
    @RequestMapping("/doRegister")
    @ResponseBody
    public SysResult doRegister(User user){
        //service 第三方接口. 直接rpc调用访问jt-sso中的实现类
        userService.saveUser(user);
        return SysResult.success();
    }


    /**
     * 2.参数:  {username:_username,password:_password}
     * 3.返回值结果:  SysResult
     *
     * 需求1: 将cookie名称为"JT_TICKET"数据输出到浏览器中，要求7天超时，并且实现"jt.com"数据共享
     *
     * Cookie特点:
     *  1.浏览器只能查看当前网址下的Cookie信息
     *  2.doMain  表示cookie共享的策略
     *    doMain: www.jd.com   当前的Cookie数据只能在当前域名中使用
     *    doMain: .jd.com      当前可以是共享的可以再域名为jd.com结尾的域名中共享
     *
     */
    @RequestMapping("/doLogin")
    @ResponseBody
    public SysResult doLogin(User user, HttpServletResponse response){
        //完成用户登录操作 之后获取ticket密钥信息
        String ticket = userService.doLogin(user);
        if(StringUtils.isEmpty(ticket)){
            //如果为空 则说明用户名或密码有问题
            return SysResult.fail();
        }
        //1.创建Cookie对象
        Cookie cookie = new Cookie("JT_TICKET",ticket);
        //2.设定cookie存活时间   value=-1 当用户关闭会话时，cookie删除
        //                      value=0 立即删除cookie  value>0  设定cookie超时时间
        cookie.setMaxAge(7*24*60*60);
        //3.在jt.com的域名中实现数据共享
        cookie.setDomain("jt.com");  //.jt.com 前面的.是自动拼接的
        cookie.setPath("/"); //一般情况下都是/
        //4.将数据保存到浏览器中
        response.addCookie(cookie);

        return SysResult.success();
    }




    /**
     * 业务说明：要求用一个方式实现页面的通用跳转
     * http://www.jt.com/user/login.html   跳转页面 login.jsp
     * http://www.jt.com/user/register.html     跳转页面 register.jsp
     */

    @RequestMapping("/{module}")
    public String doModule(@PathVariable String module){
        return module;
    }
}
